#include"comm.h"

#define buf_size 1024

key_t getftok()
{
    key_t key = ftok(pathname,proj_id);
    if(key<0)
    {
        cerr<<"errno:"<<errno<<"strerror:"<<strerror(errno)<<endl;
    }
    return key;

}

int create_shm(key_t key)
{
    int shm_id=shmget(key,Size,IPC_CREAT|0664);
    if(key<0)
    {
        cerr<<"errno:"<<errno<<"strerror:"<<strerror(errno)<<endl;
    }
    return shm_id;
}

bool Makefifo()
{
    int n = mkfifo(FILENAME, 0666);
    if(n<0)
    {
        cerr<<"errno:"<<errno<<"strerror:"<<strerror(errno)<<endl;
        return false;
    }
    return true;
}

int main()
{
start:
    int fd =open(FILENAME,O_RDONLY);
    if(fd<0)
    {
        if(Makefifo())
        {
            goto start;
        }
        else
        exit(1);
    }
   
    key_t key =getftok();

    int shm_id = create_shm(key);

    char* s =(char*)shmat(shm_id,nullptr,0);


    while(true)
    {   
        int a;
        
        int n=read(fd,&a ,sizeof a);
        if(n<0)
        {
            cerr << "server read errno:" << errno << "strerror:" << strerror(errno) << endl;
            exit(1);
        }
        else if(n==0)
        {
            break;
        }
        cout<<"server ouput: "<<s<<endl;
        
        //sleep(1);
    }

    cout<<"5s later close server !"<<endl;
    sleep(5);

    int n = shmdt((void*)s);
    if(n<0)
    {
        cerr<<"errno:"<<errno<<"strerror:"<<strerror(errno)<<endl;
    }

    int num = shmctl(shm_id,IPC_RMID,nullptr);
    if(num<0)
    {
        cerr<<"errno:"<<errno<<"strerror:"<<strerror(errno)<<endl;
    }

    cout<<"Already close server! "<<endl;
}